package vista;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;

import comun.Util;
import controlador.Sistema;
import modelo.Material;
import modelo.Proveedor;


@SuppressWarnings("serial")
public class MaterialPanel extends JPanel {

	private JButton guardarB, eliminarB, volverB;
	private JLabel codigoL, nombreL, cantidadStockL, puntoDePedidoL, costoL, proveedorL;
	private JSpinner cantidadStockS, puntoDePedidoS, costoS;
	@SuppressWarnings("rawtypes")
	private JComboBox proveedoresC;
	private JTextField codigoT, nombreT;
	private boolean update = false;
	private Material material;
	
	private Vector<Proveedor> proveedores;

	
	public MaterialPanel(Vector<Proveedor> proveedores) {
		this.proveedores = proveedores;
		initGui();
		layoutComponents();
		initActions();
	}

	public MaterialPanel(Vector<Proveedor> proveedores, Material material) {
		this(proveedores);
		setMaterial(material);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initGui() {
		codigoL = new JLabel("* Codigo");
		nombreL = new JLabel("* Nombre");
		cantidadStockL = new JLabel("Cantidad en stock:");
		puntoDePedidoL = new JLabel("Punto de pedido:");
		costoL = new JLabel("Costo:");
		proveedorL = new JLabel("Proveedor");

		cantidadStockS = new JSpinner(new SpinnerNumberModel(1,0,10000,1));
		puntoDePedidoS = new JSpinner(new SpinnerNumberModel(1,0,10000,1));
		costoS = new JSpinner(new SpinnerNumberModel(1F,0.0F,10000F,0.1F));
		
		volverB = new JButton("Volver");
		guardarB = new JButton("Guardar");
		eliminarB = new JButton("Eliminar");
		eliminarB.setVisible(false);

		codigoT = new JTextField(10);
		nombreT = new JTextField(10);

		proveedoresC = new JComboBox(proveedores);

	}

	

	private void layoutComponents() {
		this.setLayout(new GridBagLayout());

		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0, 2, 2, 4);
		add(codigoL, c);

		c.gridy = GridBagConstraints.RELATIVE;
		add(nombreL, c);
		add(cantidadStockL, c);
		add(puntoDePedidoL, c);
		add(costoL, c);
		c.ipady = 20;
		add(proveedorL, c);

		c.gridx = 1;
		c.gridy = 0;
		c.ipady = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0, 2, 2, 4);
		c.ipadx = 100;
		add(codigoT, c);

		c.gridy = GridBagConstraints.RELATIVE;
		add(nombreT, c);
		add(cantidadStockS, c);
		add(puntoDePedidoS, c);
		add(costoS, c);
		add(proveedoresC, c);


		c.gridx = 0;
		c.gridy = 6;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.ipady = 0;
		c.insets = new Insets(20, 0, 20, 0);

		
		add(guardarB, c);
		c.insets = new Insets(20, 30, 20, 0);
		c.gridx = 1;
		c.ipadx = 20;
		c.fill = GridBagConstraints.NONE;
		add(eliminarB, c);
		c.gridx = 1;
		c.insets = new Insets(20, 160, 20, 0);
		add(volverB, c);

	}

	private void initActions() {
		guardarB.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (validateFields()) {
					boolean guardado = guardarMaterial();
					clearFields();
					SwingUtilities.windowForComponent(MaterialPanel.this).dispose();
					if(guardado) {
						notificarMensaje("El material fue guardado con exito");
					} else {
						notificarError("Ocurrio un error, no pudo guardarse el material");
					}
					

				}
			}
		});
		
		eliminarB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				int n = JOptionPane.showConfirmDialog(
					    MaterialPanel.this,
					    "Esta seguro que desea eliminar el material?",
					    "Alerta",
					    JOptionPane.YES_NO_OPTION);
				if(n == JOptionPane.YES_OPTION) {
					boolean eliminado = eliminarMaterial();
					if(eliminado) {
						notificarMensaje("El material fue eliminado con exito");
					} else {
						notificarError("Ocurrio un error, no pudo eliminarse el material");
					}
					SwingUtilities.windowForComponent(MaterialPanel.this).dispose();
				}
			}

		});

		volverB.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				SwingUtilities.windowForComponent(MaterialPanel.this).dispose();
				clearFields();
			}
		});

	}
	
	private boolean guardarMaterial() {
		boolean result = false;
		String nombre = nombreT.getText();
		String codigo = codigoT.getText();
		int cantidadStock = (Integer) cantidadStockS.getValue();
		int puntoDePedido = (Integer) puntoDePedidoS.getValue();
		float costo = (Float) costoS.getValue();
		Proveedor proveedor = (Proveedor)proveedoresC.getSelectedItem();
		
		if(update) {
			result = Sistema.getInstance().modificarMaterial(material.getCodigo(), codigo, nombre, cantidadStock, puntoDePedido, proveedor.getCodigo(), costo);
		} else {
			result = Sistema.getInstance().agregarMaterial(codigo, nombre, cantidadStock, puntoDePedido, proveedor.getCodigo(), costo);
		}
		
		return result;
	}
	
	private boolean eliminarMaterial() {
		boolean result = false;
		result = Sistema.getInstance().bajaMaterial(material.getCodigo());
		return result;
	}
	
	public void showPanel() {
		final JFrame mainFrame = new JFrame();
		mainFrame.setTitle("Nuevo Material");
		mainFrame.getContentPane().add(this);
		mainFrame.setPreferredSize(new Dimension(700, 380));
		mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		mainFrame.pack();
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setVisible(true);
	}

	private boolean validateFields() {
		
		String nombreV = nombreT.getText();
		String codigoV = codigoT.getText();

		if (nombreV.length() == 0 || codigoV.length() == 0) {
			notificarError("Por favor complete todos los campos obligatorios marcados con *");
			return false;
		}

		return true;
	}
	
	private void setMaterial(Material material) {
		this.material = material;
		update = true;
		eliminarB.setVisible(true);
		nombreT.setText(material.getNombre());
		codigoT.setText(material.getCodigo());
		proveedoresC.setSelectedItem(material.getProveedor());
		costoS.setValue(material.getPrecio());
		puntoDePedidoS.setValue(material.getPtoPedido());
		cantidadStockS.setValue(material.getStock());
	}

	private void clearFields() {
		nombreT.setText("");
		codigoT.setText("");
		proveedoresC.setSelectedIndex(0);
		costoS.setValue(1);
		puntoDePedidoS.setValue(1);
		cantidadStockS.setValue(1);
	}
	
	private void notificarMensaje(String mensaje) {
		Util.displayFeedbackMessage(MaterialPanel.this, mensaje);
	}
	
	private void notificarError(String error) {
		Util.displayErrorMessage(MaterialPanel.this,error);
	}
	
	@SuppressWarnings("unchecked")
	public void actualizarProovedores(Vector<Proveedor> proveedores) {
		proveedoresC.removeAllItems();
		for(Proveedor proveedor: proveedores) {
			proveedoresC.addItem(proveedor);
		}
		proveedoresC.revalidate();
	}

}